oracle索引(oracle主键和唯一索引的区别)
资讯
2023-12-24
37
1. oracle索引,oracle主键和唯一索引的区别?
区别:oracle在创建主键的同时会生成对应的唯一索引,主键在保证数据唯一性的同时不允许为空,而唯一索引可以有一个为空的数据项,一个表中只能有一个主键,但是一个主键可以有多个字段,一个表中可以有多个唯一索引。
2. Oracle中的位图索引是什么?
主要分为一般索引和位图索引,一般索引就是B+树(大名鼎鼎的矮胖树),mysql和sybase 还有特殊的聚簇索引(少了一次检索而已),位图索引就是bitmap。NOSQL一般在写多读少场景下使用LSM树。
3. 如何检测oracle里面的索引和存储过程是否失效?
SELECT * FROM dba_objects t where t.OBJECT_TYPE='PROCEDURE';
SELECT * FROM dba_objects t where t.OBJECT_TYPE='INDEX';
dba_objecst里面有个status字段,valid为有效,invalid即为失效
4. oracle数据库的全文检索?
Oracle全文检索配置方法:
1.检查数据库是否具有全文检索功能(这是针对已经建成使用的数据库)
查看用户中是否存在ctxsys用户,查询角色里是否存在ctxapp角色。以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。
使用contains函数的时候,若没有全文检索则会报错的。
2.若没有,则需要手动建立,先建立全文检索要使用的空间
sqlplus / as sysdba --进入控制台
create tablespace Idx_ctxsys datafile '/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间
3.创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql
还是在sqlplus中执行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在执行这个脚本的时候,输入了几个参数,第一个参数ctxsys为ctxsys用户的密码
第二个参数Idx_ctxsys为ctxsys用户要使用的表空间
第三个参数temp为ctxsys用户使用的临时表空间
第四个参数nolock为ctxsys用户处于解锁状态。
4.创建完成后,要登录ctxsys用户
connect ctxsys/ctxsys
执行以下脚本:@?/ctx/admin/defaults/drdefus.sql(这是个很重要的脚本,后面创建索引会使用该脚本创建的信息)
5.创建全文索引语法分析器
先要明确使用全文索引的用户,我要使用全文索引的是sgpm用户
因此
grant execute on ctxsys.ctx_ddl to sgpm with grant option;
connect sgpm/sgpm
设置语法分析器:
exec ctx_ddl.drop_preference('chinalexer');exec ctx_ddl.create_preference('chinalexer','chinese_lexer');
设置词法属性:
exec ctx_ddl.drop_preference('idx_c_store');
beginctx_ddl.create_preference('idx_c_store','BASIC_STORAGE');ctx_ddl.set_attribut('idx_c_store','I_TABLE_CLAUSE','tablespaces Idx_ctxsy');ctx_ddl.set_attribute('idx_c_store','I_INDEX_CLAUSE','tablespace Idx_ctxsy compress 2');end;/
6.创建索引
create index sgpm.idx_c_cons_name on sgpm.c_cons(cons_name) indextype is ctxsys.context parameters('lexer chinalexer storage idx_c_store');
7.同步索引
variable jobno number;begindbms_job.submit(:jobno,'pkg_sp_tools.p_cont_sys_index();',sysdate,'trunc(sysdate)+19/24+1'); --执行的是个性化方法。end;/
普通的就是用:
exec ctx_ddl.sync_index('idx_c_cons_name');
到此,全文检索创建成功,contains函数就可以正常使用了。
注意:创建的过程中会出现ORA-29879:cannot create multiple domain index on a column listusing same indextype ,这说明在其他用户下已经建立了该索引。
5. 其中的一个字段是否可以用来进行索引?
,Oracle经验有限,试答: 1.单索引的情况下,where 字段用两个查询条件,一个是索引条件,另一个是非索引条件,那么是全表查询还是进行索引? --如果这两个条件间是and运算,那么就用索引查第一个条件,然后再用第二个条件过滤。如果是or运算就不是了,我觉得是要全表查询的。 2.在复合索引的条件下,假设是2个字段进行复合索引,可是查询条件只有复合索引中其中一个字段,那么是全表查询还是进行索引? --索引字段是有顺序的,想象一下一个表按两个字段排过序,肯定有一个主一个副,主字段相同的情况下才看副字段。所以查询条件有第一个索引字段的时候,才会按索引查询。否则查询条件就算有第二个索引字段,但因为没有第一个索引字段,还是会做全表查询。
6. 唯一索引列允许为null吗?
Oracle 的唯一索引列是否允许为null,取决于创建唯一索引时是否指定了NULLS ALLOWED或NOT NULLS参数:
1. 指定NULLS ALLOWED:
允许唯一索引列为null值。此时如果存在多个行的索引列都为null,不会违反唯一性约束。
语法:
sql
CREATE UNIQUE INDEX 索引名
ON 表名 (索引列名) NULLS ALLOWED;
2. 指定NOT NULL或没有指定NULL属性:
不允许唯一索引列为null值。此时唯一索引列中只能包含一个null值,会违反唯一性要求。
语法:
sql
CREATE UNIQUE INDEX 索引名
ON 表名 (索引列名) NOT NULL;
7. oracle查询表列名显示注释?
倒序索引在Oracle中是所谓的function based index,所以在user_ind_columns中你只能看到系统自动生成的名字,而非实际列名。如果想看到实际的列名,可以用user_ind_columns去join user_ind_expressions,实际列名在column_expression中,不过是long type。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!
1. oracle索引,oracle主键和唯一索引的区别?
区别:oracle在创建主键的同时会生成对应的唯一索引,主键在保证数据唯一性的同时不允许为空,而唯一索引可以有一个为空的数据项,一个表中只能有一个主键,但是一个主键可以有多个字段,一个表中可以有多个唯一索引。
2. Oracle中的位图索引是什么?
主要分为一般索引和位图索引,一般索引就是B+树(大名鼎鼎的矮胖树),mysql和sybase 还有特殊的聚簇索引(少了一次检索而已),位图索引就是bitmap。NOSQL一般在写多读少场景下使用LSM树。
3. 如何检测oracle里面的索引和存储过程是否失效?
SELECT * FROM dba_objects t where t.OBJECT_TYPE='PROCEDURE';
SELECT * FROM dba_objects t where t.OBJECT_TYPE='INDEX';
dba_objecst里面有个status字段,valid为有效,invalid即为失效
4. oracle数据库的全文检索?
Oracle全文检索配置方法:
1.检查数据库是否具有全文检索功能(这是针对已经建成使用的数据库)
查看用户中是否存在ctxsys用户,查询角色里是否存在ctxapp角色。以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。
使用contains函数的时候,若没有全文检索则会报错的。
2.若没有,则需要手动建立,先建立全文检索要使用的空间
sqlplus / as sysdba --进入控制台
create tablespace Idx_ctxsys datafile '/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间
3.创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql
还是在sqlplus中执行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在执行这个脚本的时候,输入了几个参数,第一个参数ctxsys为ctxsys用户的密码
第二个参数Idx_ctxsys为ctxsys用户要使用的表空间
第三个参数temp为ctxsys用户使用的临时表空间
第四个参数nolock为ctxsys用户处于解锁状态。
4.创建完成后,要登录ctxsys用户
connect ctxsys/ctxsys
执行以下脚本:@?/ctx/admin/defaults/drdefus.sql(这是个很重要的脚本,后面创建索引会使用该脚本创建的信息)
5.创建全文索引语法分析器
先要明确使用全文索引的用户,我要使用全文索引的是sgpm用户
因此
grant execute on ctxsys.ctx_ddl to sgpm with grant option;
connect sgpm/sgpm
设置语法分析器:
exec ctx_ddl.drop_preference('chinalexer');exec ctx_ddl.create_preference('chinalexer','chinese_lexer');
设置词法属性:
exec ctx_ddl.drop_preference('idx_c_store');
beginctx_ddl.create_preference('idx_c_store','BASIC_STORAGE');ctx_ddl.set_attribut('idx_c_store','I_TABLE_CLAUSE','tablespaces Idx_ctxsy');ctx_ddl.set_attribute('idx_c_store','I_INDEX_CLAUSE','tablespace Idx_ctxsy compress 2');end;/
6.创建索引
create index sgpm.idx_c_cons_name on sgpm.c_cons(cons_name) indextype is ctxsys.context parameters('lexer chinalexer storage idx_c_store');
7.同步索引
variable jobno number;begindbms_job.submit(:jobno,'pkg_sp_tools.p_cont_sys_index();',sysdate,'trunc(sysdate)+19/24+1'); --执行的是个性化方法。end;/
普通的就是用:
exec ctx_ddl.sync_index('idx_c_cons_name');
到此,全文检索创建成功,contains函数就可以正常使用了。
注意:创建的过程中会出现ORA-29879:cannot create multiple domain index on a column listusing same indextype ,这说明在其他用户下已经建立了该索引。
5. 其中的一个字段是否可以用来进行索引?
,Oracle经验有限,试答: 1.单索引的情况下,where 字段用两个查询条件,一个是索引条件,另一个是非索引条件,那么是全表查询还是进行索引? --如果这两个条件间是and运算,那么就用索引查第一个条件,然后再用第二个条件过滤。如果是or运算就不是了,我觉得是要全表查询的。 2.在复合索引的条件下,假设是2个字段进行复合索引,可是查询条件只有复合索引中其中一个字段,那么是全表查询还是进行索引? --索引字段是有顺序的,想象一下一个表按两个字段排过序,肯定有一个主一个副,主字段相同的情况下才看副字段。所以查询条件有第一个索引字段的时候,才会按索引查询。否则查询条件就算有第二个索引字段,但因为没有第一个索引字段,还是会做全表查询。
6. 唯一索引列允许为null吗?
Oracle 的唯一索引列是否允许为null,取决于创建唯一索引时是否指定了NULLS ALLOWED或NOT NULLS参数:
1. 指定NULLS ALLOWED:
允许唯一索引列为null值。此时如果存在多个行的索引列都为null,不会违反唯一性约束。
语法:
sql
CREATE UNIQUE INDEX 索引名
ON 表名 (索引列名) NULLS ALLOWED;
2. 指定NOT NULL或没有指定NULL属性:
不允许唯一索引列为null值。此时唯一索引列中只能包含一个null值,会违反唯一性要求。
语法:
sql
CREATE UNIQUE INDEX 索引名
ON 表名 (索引列名) NOT NULL;
7. oracle查询表列名显示注释?
倒序索引在Oracle中是所谓的function based index,所以在user_ind_columns中你只能看到系统自动生成的名字,而非实际列名。如果想看到实际的列名,可以用user_ind_columns去join user_ind_expressions,实际列名在column_expression中,不过是long type。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!